﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyDelegate.Event
{
    /// <summary>
    /// 猫：
    /// 
    /// 面试者：以面向对象的思想实现一下的场景：
    /// 猫：Miao一声，紧接着引发了一系列的行为~ 
    /// Miao:引发了一系列的动作； 
    /// 
    /// 从代码层面来说：代码这样写好吗？ 
    /// 1. 猫职责不单一（猫就是猫，他的行为只有Miao一声）
    /// 2. 依赖太重，依赖了很多的普通类；   被依赖的类如果修改，可能会引发这个猫也要修改；---代码不稳定；
    /// 3. 如果要控制顺序---也要修改代码； 有新需求，必须要修改历史代码---开闭原则；
    /// 
    /// 如何解决呢？  第一个问题：让猫的职责单一,  后续触发的行为，猫Miao一声之后，只负责触发； 触发的是一堆的行为；
    /// 请问：如果要希望在触发一个行为后，能够执行多个行为，执行一系列的行为？？ 怎么办？-------多播委托；
    /// 
    /// 核心：把依赖的东西转移到上端，保证当前类的稳定； ----可以做到解耦
    /// 二者实现本质：是想通的；  都是类似于一个盒子， OOP: 盒子中装对象     委托：盒子装方法；
    /// 
    /// 
    /// </summary>
    public class Cat
    {  
        /// <summary>
        /// 通过OOP  继承来实现的Observer
        /// </summary>
        public List<IObject> ObserList=new List<IObject>(); 
        public void MiaoObserver()
        {
            Console.WriteLine($"{this.GetType().Name} MiaoObserver========");
            //也要触发一串行为 
            foreach ( IObject item in ObserList )
            { 
                item.DoAction();
            } 
        }


        //通过委托  来实现的Observer
        public Action ActionHander;  //委托的本质：类
        public void Miao()
        {
            
            Console.WriteLine($"{this.GetType().Name} Miao========");
            ActionHander.Invoke(); 
        }
        
        //前面是一个类
        //下面是一个类的实例
         
        //事件
        public event Action ActionHanderEvent;   
        public void MiaoEvent()
        {
            Console.WriteLine($"{this.GetType().Name} MiaoEvent========");
            ActionHanderEvent.Invoke();   //这个行为要一定是执行 MiaoEvent方法的时候才触发的；
        } 
        //什么是事件，其实就是委托的实例+关键字； 事件是一个特殊的委托；
        //委托和事件有什么区别？
        //1 多个了关键字
        //2 事件的权限控制会更加严格--事件的执行，只能，必须在声明这个事件所在的类的内部才能执行； 
        //已经有了委托，为什么还要事件呢？----在系统框架设计中，需要这样的权限控制；

    }

    public class ChildCat : Cat
    {
        public void Show()
        {
            //base.ActionHanderEvent += () => { };
            //base.ActionHanderEvent -= () => { };

            //base.ActionHanderEvent.Invoke(); //也是不允许的；
        }
    }
}
